package com.atguigu.realtime.demos

import java.util

import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}
import com.google.gson.Gson

import scala.collection.mutable.ListBuffer

/**
 * Created by Smexy on 2022/8/26
 */
object JsonParseDemo {

  /*
       fastjson:  阿里巴巴推出
                  特点：   静态方法。

                  核心类：  JSON
                      {}字符串转java对象:   JSON.parseObject()
                              返回值:  JSONObject(Map)   或   T
                      []字符串转java对象:   JSON.parseArray()
                              返回值:   JSONArray(List)   或  List[T]


                      java对象转字符串:   JSON.toJSONString()


       gson:      google推出
                 特点：   实例方法

                 核心类：  Gson

                      java对象转字符串:   Gson.toJSON()
   */
  def main(args: Array[String]): Unit = {

    val gson = new Gson()

    val cat1: Cat = Cat("小花", "白毛")
    val cat2: Cat = Cat("小黑", "黑毛")

    val cats: util.List[Cat] = util.Arrays.asList(cat1, cat2)

    //fastjson
    /*
      Error:(41, 18) ambiguous reference to overloaded definition,
both method toJSONString in class JSON of type (x$1: Any, x$2: com.alibaba.fastjson.serializer.SerializerFeature*)String
and  method toJSONString in class JSON of type (x$1: Any)String
match argument types (com.atguigu.realtime.demos.Cat) and expected result type Any
    println(JSON.toJSONString(cat1))

    fastjson对scala的样例类，不是很友好。能用，需要明确再传入参数 x$2: com.alibaba.fastjson.serializer.SerializerFeature*，比较麻烦

    推荐用gson
     */
    /*println(JSON.toJSONString(cat1))
    println(JSON.toJSONString(cats))*/

    println(gson.toJson(cat1))
    println(gson.toJson(cats))

    // 字符串还原为java对象，建议用fastjson
    val str1 =
      """
        |{"name":"小花","color":"白毛"}
        |""".stripMargin

    val str2=
      """
        |
        |[{"name":"小花","color":"白毛"},{"name":"小黑","color":"黑毛"}]
        |""".stripMargin

    val json: JSONObject = JSON.parseObject(str1)

    println(json)

    val cat: Cat = JSON.parseObject(str1, classOf[Cat])

    println(cat)

    val array: JSONArray = JSON.parseArray(str2)

    val cats1: util.List[Cat] = JSON.parseArray(str2, classOf[Cat])

    println(array)

    println(cats1)


  }

}


case class Cat(name:String ,color:String)
